<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>23.使用instanceof检测对象实现</title>
</head>

<body>
s
</body>
<script>
  //使用 instanceof 用于检测，下面是在原型中的分析（已经在原型与继承中讲过）
  // 检测一个 构造函数的原型是否存在于这个对象的原型链上，或者说一个对象是否是由另一个构造函数实现的
  function User () { }
  function Admin () { }
  Admin.prototype = Object.create(User.prototype);
  let hd = new Admin();
  console.log(hd instanceof Admin); //true
  console.log(hd instanceof User); //true
  // 两个instanceof 相当于
  console.log(hd.__proto__ == Admin.prototype);
  console.log(hd.__proto__.__proto__ == User.prototype);
  //下面是递归检测原型的代码，帮助你分析 instanceof 的原理
  function checkPrototype (obj, constructor) {
    if (!obj.__proto__) return false;
    if (obj.__proto__ == constructor.prototype) return true;
    return checkPrototype(obj.__proto__, constructor);
  }

  console.log(checkPrototype(hd, User));

  // 使用类的方式原理上是一样的
  class User2 { }
  class Admin2 extends User2 { }
  let hd2 = new Admin2();
  console.log(hd2 instanceof Admin2); //true
  console.log(hd2 instanceof User2); //true
</script>

</html>